原本log打算2天KO
不小心就給他寫了4天
昨天提到的 ILogger
物件就是由ILoggerFactory
所建立的
ILoggerFactory.cs
public interface ILoggerFactory : IDisposable
{
ILogger CreateLogger(string categoryName);
void AddProvider(ILoggerProvider provider);
}
欸,這個ILogger CreateLogger(string categoryName);
似曾相似。
沒錯,在ILoggerProvider
中也有這個方法。
那為什麼說昨天提到的ILogger
物件是ILoggerFactory
所建立的呢。
其實昨天提到的比較偏向預設實作為Logger
的ILogger
物件ILoggerFactory
所建立的ILogger
(下面稱呼為 FactoryLogger
)
實質上比較像由 ILoggerProvider
所建立 ILogger
(下面稱呼為 ProviderLogger
) 組合而成的
當FactoryLogger
接收到要記錄的事件的時候,他會分發給所有註冊的 ProviderLogger
在分發之前,不同的ProviderLogger
也可能會有不同的過濾行為
這些過濾也會由FactoryLogger
所處理
講了這多,還是很模糊,我們來看看圖
這是簡易版UML沒有什麼作用,練習畫圖
圖要搭範例才有感覺,先看以下的程式
var loggerFactory = new LoggerFactory();
loggerFactory.AddProvider(new DebugLoggerProvider());
var logger = loggerFactory.CreateLogger<Program>();
logger.LogInformation("Hello, World!");
我們先在建立一個 LoggerFactory
他是 ILoggerFactory
的預設實作
並且添加了DebugLoggerProvider
的 ILoggerProvider
。
然後透過loggerFactory.CreateLogger<Program>()
建立一個 categoryName 為 Program
的ILogger
這時候背後的圖大Guy是這樣
如果我們今天再添加了一個新的ILoggerProvider
loggerFactory.AddProvider(new DebugLoggerProvider());
loggerFactory.AddProvider(new ConsoleLoggerProvider()); // ignore constructor
這時後會是
如果我們再添加一個category
var loggerFactory = new LoggerFactory();
loggerFactory.AddProvider(new ConsoleLoggerProvider());
loggerFactory.AddProvider(new DebugLoggerProvider());
var programLogger = loggerFactory.CreateLogger<Program>();
var myLogger = loggerFactory.CreateLogger("MyLogger");
programLogger.LogInformation("Hello, World!");
myLogger.LogInformation("Hello, World!");
就會變成醬子
注意到了嗎,當FactoryLogger
Log的時候
會分配給底下ProviderLogger
進行Log 輸出到對應的管道